Skip to content

THE STACKS: the back catalog as a walkable room (/archive)#63

Merged
isaacsight merged 13 commits into
mainfrom
feat/the-stacks
Jul 21, 2026
Merged

THE STACKS: the back catalog as a walkable room (/archive)#63
isaacsight merged 13 commits into
mainfrom
feat/the-stacks

Conversation

@isaacsight

Copy link
Copy Markdown
Owner

Stacked on #62

This PR targets feat/real-urls-cloudflare (#62), not main — the room assumes real paths for camera-push navigation into /issues/N. Merge #62 first, then this.

What this ships (M1)

A new /archive room — THE STACKS — the back catalog as a walkable dark space. Reference: The SUKIMA project (floating scanned-clay objects, scroll-descent into editorial spreads).

  • Volumes by cover month (src/stacks/volumes.ts): the room walks newest → oldest, mirroring the flat catalog's own grouping.
  • Typographic sheet bodies (src/stacks/coverPainter.ts, Scene.tsx): covers are painted as type-on-stock onto canvas textures — no new image assets. bodyFor() (bodies.ts) is the one seam later milestones extend (M2 artifact-era instruments, M3 procedural monuments, M4 the first photogrammetry scan — KERNEL PRESS Edition №001).
  • Accessible by construction: a real DOM ledger (headings + <Link>s) is the resting structure; the r3f canvas is presentational on top, gated behind a WebGL2 probe. No WebGL2 → complete, navigable ledger only.
  • Motion law amendment: drift is rAF-driven (useFrame), which needed a new ratified exception in .claude/rules/components.md ("walkable-room exception", alongside the existing plate/bore/fourier/audit working-model exception) — same reduced-motion collapse contract, confined to src/stacks/.
  • Chunk-isolated: three.js/@react-three/fiber/drei live only in the lazy /archive route chunk. Main bundle unchanged at 236.44KB gzip (budget 300KB) — confirmed by grepping the built output for three.js symbols (zero in the main chunk).

Two bugs caught during review, fixed in this branch

  • The issue registry isn't uniformly abbreviated — 18 issues spell out 'APRIL', 2 spell out 'JUNE' instead of the 3-letter form every other issue uses. volumes.ts's month lookup assumed uniformity and broke ~20 issues' Japanese labels + grouping keys. Fixed by normalizing on the first 3 letters; verified against all 68 real issues (zero undefined/NaN).
  • Whole-branch review found .pop-folio text rendering ink-on-ink in the dark room (near-invisible) and un-disposed textures/geometries on repeated navigation (GPU leak). Both fixed.

Process

Spec → plan → subagent-driven execution (7 tasks, each independently implemented + reviewed) → whole-branch review → fix pass. Design spec: docs/superpowers/specs/2026-07-20-the-stacks-design.md. Plan: docs/superpowers/plans/2026-07-20-the-stacks-m1.md.

Verification

tsc clean · lint:adherence + lint:editorial clean · 810/810 unit tests · e2e 4/4 · design-QA audit clean on /archive (desktop + mobile) · reduced-motion collapse traced and verified.

🤖 Generated with Claude Code

Your Name and others added 13 commits July 20, 2026 16:14
Approved in design review: /archive room, volumes by cover month,
four body kinds (sheet / instrument / monument / scan) resolved by
bodyFor(issue), r3f in the lazy route chunk, laws section covering
motion, keyboard, degradation, vocabulary, and budget. Reference:
The SUKIMA project (claygarden.jp).

Co-Authored-By: Claude Fable 5 <[email protected]>
Isaac's call in design review: THE STACKS' drifting bodies use
react-three-fiber's useFrame (rAF-driven), which the editorial
surface's CSS-only motion law would otherwise forbid. Extends the
existing working-model exception (ISSUE 419/420/421/422) rather than
reclassifying /archive as engine surface — a room is a working model
too. Same collapse contract: reduced-motion drops to a static, fully
navigable layout; confined to src/stacks/; the real-DOM ledger is
the CSS-only resting structure this section requires and stands
alone when the canvas layer is absent.

Co-Authored-By: Claude Fable 5 <[email protected]>
Task 4 review found the leading-slash form resolves identically today
(the Layout parent is literally '/'), but is inconsistent with every
sibling entry and would break if the parent path ever changed.

Co-Authored-By: Claude Fable 5 <[email protected]>
…breviated

Task 6's design-QA audit surfaced a broken volume heading
('JUNE 2026二〇二六年undefined'). Root cause: the registry mixes
3-letter months ('JUL') with full names — 18 issues spell out
'APRIL', 2 spell out 'JUNE' — but monthIndex() assumed uniform
abbreviations, so ~20 issues (nearly a third of the catalog) got a
failed MONTH_JP lookup and a miskeyed grouping bucket.

Fix normalizes on the first three letters (every full month name's
first three letters equal the standard abbreviation) rather than
touching twenty content files. Two regression tests added.

Gates: adherence + editorial clean, tsc clean, 810/810 tests.

Co-Authored-By: Claude Fable 5 <[email protected]>
KERNEL.md's directory map gains src/stacks/; PUBLISHING.md points new
issues at the room (no extra work needed — bodies resolve from the
same ALL_ISSUES registry); SCRATCHPAD records the session, the
ratified motion exception, and the two bugs review caught (missing
sitemap script on PR #62, the APRIL/JUNE month-normalization fix).

Co-Authored-By: Claude Fable 5 <[email protected]>
Whole-branch review findings:
- .pop-folio hardcodes ink-on-cream; the room is ink-on-ink, so the
  masthead tagline and every N°<number> ledger folio rendered near-
  invisible. Scoped override in ArchivePage.css.
- SheetBody's per-issue CanvasTexture and PlaneGeometry were never
  disposed, leaking GPU memory across repeated /archive visits.
  Cleanup effect added.

Co-Authored-By: Claude Fable 5 <[email protected]>
@isaacsight
isaacsight changed the base branch from feat/real-urls-cloudflare to main July 21, 2026 01:00
@isaacsight
isaacsight merged commit 4d17930 into main Jul 21, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant